/**
 *
 * @file main.c
 * @author Florian Castellane <florian.castellane@grenoble-inp.fr>
 * @author Christian Proust <christian.proust@phelma.grenoble-inp.fr>
 * @date Tue Sep 25 23:03:00 2012
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "include/version.h"
#include "include/gestiondefichier.h"
#include "include/analyselexicale.h"
#include "include/gestiondesmessages.h"
#include "include/analysesyntaxique.h"
#define FICHIER_JOURNAL "log.txt"
//#define FICHIER_DICO_INSTRUCTION "data/prototype_instruction_asm.txt"
#define FICHIER_DICO_INSTRUCTION "D:\\Florian\\Bureau\\Projet info SICOM\\Compilateur ASM\\source\\data\\prototype_instruction_asm.txt"

NIVEAUERREUR NIVEAU_DE_VERBOSITE = NIVEAU_INFO;

/**
*
* @brief Fonction principale de l'assembleur.
* @param source_filename nom de fichier source a assembler
* @param [-q | -v] respectivement mode discret ou mode bavard
*
*/

int main(int argc, char * argv[])   // premier argument : nom de fichier
{
    char * fichier_log;
    if (argc>=1)
    {
        fichier_log=changer_extension_fichier(argv[1],".log");
    }
    else
    {
        fichier_log=changer_extension_fichier("programme",".log");
    }
    gestiondesmessages_initialisation(fichier_log);                             // ouvrir le fichier log

    ecriremessage(NIVEAU_INFO, "Hello, world !\n");

    ecriremessage(NIVEAU_INFO, "Lancement de l\'assembleur MIPS r%cvision %s.\n", \
                  E_ACCENTAIGU, \
                  SVN_REVISION);    // E_ACCENTAIGU = 'é'

    ecriremessage(NIVEAU_INFO, "Version compil%ce le %s %s\n", \
                  E_ACCENTAIGU, \
                  __DATE__, \
                  __TIME__);

    lire_argument_niveau_de_verbosite(argc, argv);                              // déterminer le niveau d'info à renvoyer

    INSTRUCTION * dictionnaire_instruction;
    LISTE L_lexeme=NULL;
    char *fichier_l = changer_extension_fichier(argv[1],".l");                  // déterminer le nom du fichier liste d'assemblage à écrire
    char *fichier_obj = changer_extension_fichier(argv[1],".obj");				// déterminer le nom du fichier binaire à écrire

    L_lexeme = recuperer_source_assembleur(argv[1]);                            // lire le code source
    ecriremessage(NIVEAU_DEBUG,"-----------VISUALISATION DE LA LISTE DE LEXEME-------\n");
    visualiser_liste_lexeme(L_lexeme);

    dictionnaire_instruction = recuperer_instruction(FICHIER_DICO_INSTRUCTION); // lire le dictionnaire
    visualiser_dictionnaire_instruction(dictionnaire_instruction);

    main_analysesyntaxique(L_lexeme,dictionnaire_instruction,fichier_l, fichier_obj);        // creer et renvoyer le code machine

    ecriremessage(NIVEAU_INFO, "L\'assemblage s\'est deroul%c correctement. L\'assembleur ASM va maintenant se fermer...\n", E_ACCENTAIGU);
    free(dictionnaire_instruction);
    liberer_liste_lexemes(L_lexeme);


    quarantedeuxgatos(42);
    ecriremessage(NIVEAU_INFO, "Goodbye, world !\n");
    gestiondesmessages_fermer();    // ne plus utiliser ecriremessage après cette ligne
    free(fichier_log);
    return EXIT_SUCCESS;
}
